package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * JDK5之后，java推出了一个新特性-泛型
 * 泛型也成为参数化类型，允许一个类在使用时在指定一个类型给它，用语确定其内部某个属性的类型或方法
 * 参数的类型或返回值的类型，使用更便捷。
 * 在集合中泛型广泛使用，用于规定集合中的元素类型
 *
 *
 * 集合的遍历             die(二声)
 * 集合提供了统一的遍历方式:迭代器模式
 *
 * Iterator iterator()
 * 该方法会返回一个用于遍历当前集合元素的迭代器
 *
 * 迭代器遍历集合元素遵循的过程为:问->取->删
 * 其中删除操作不是遍历的必要过程
 *
 */
public class IteratorDemo {
    public static void main(String[] args) {
        //Collection<E> 集合声明时定义了一个泛型E
        Collection<String> c = new ArrayList<>();//实际使用集合时为E指定实际类型，如:String
        //add(E e) add方法的参数类型使用了集合的泛型E
        c.add("one");//编译器会检查实参类型是否与泛型E一致
        c.add("#");
        c.add("two");
        c.add("#");
        c.add("three");
        c.add("#");
        c.add("four");
        c.add("#");
        c.add("five");
//        c.add(100);//实参不符合方法参数泛型的实际类型则编译不通过

        /*
            迭代器有两个重要的方法:
            boolean hasNext():判断集合是否还有下一个元素可供遍历   问
            E next():迭代器获取下一个元素                        取
         */
        //遍历集合c
        Iterator<String> it = c.iterator();//迭代器也支持泛型，与遍历的集合泛型一致即可
        while(it.hasNext()){
            String str = it.next();
            if("#".equals(str)){//字符串变量与字面量equals时要将字面量放前面，避免空指针
//                c.remove(str);//迭代器遍历过程中不允许通过集合的方法增删元素，否则会抛出异常!!
                it.remove();//迭代器的remove不需要传递参数，删除的是本次next获取的元素
            }
        }

        System.out.println(c);//[one,two,three,four,five]


    }
}





